/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package p2p;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import p2p.Paquete;


/**
 *
 * @author Administrador
 */
public class Modelo extends Observable{

    public static String cad;
    public boolean debugger = false;
    public Controller controller;
    public MulticastSocket socket,socket2;
    public InetAddress red;
    DatagramPacket paquete;
    public ArrayList<String> vecinos = new ArrayList<String>();
    public ArrayList<String> vecinosVivos = new ArrayList<String>();
     final List<Paquete> rotando = Collections.synchronizedList(new ArrayList<Paquete>()); 
    public ArrayList<Paquete> temporal = new ArrayList<Paquete>();
    public ArrayList<Paquete> temporal2 = new ArrayList<Paquete>();
    public ArrayList<Archivo> archivos = new ArrayList<Archivo>();
    ArrayList<Paquete> partesArchivo,vecinosPartes = new ArrayList<Paquete>();
    public String archivoBorrar = "", contenidoArchivo = "";
    public int PUERTO = 9000, contRecibidos = 0, contEnviados=0, cicloBorrado = -1;
    public long DELAY = 2000L;
    public int TAMANO_BUFER = 900;
    public String IP_BROAD = "225.4.5.6", ip;
    public Vista vista;
    public ServiciosArchivos serviciosArchivos;
    Thread rotar,vivo;
    ServiciosArchivos servicios = new ServiciosArchivos();

    public Modelo(Controller controller, Vista v) throws IOException {
        serviciosArchivos=new ServiciosArchivos();
        this.controller = controller;
        vista = v;
        
    }

    public void conectar() throws Throwable {
        class conectar extends Thread {

            public int puerto;
           

            public conectar() throws IOException {
                super();
                socket = new MulticastSocket(PUERTO);
                socket.setBroadcast(true);
                socket2 = new MulticastSocket(PUERTO+1);
                socket2.setBroadcast(true);
                red = InetAddress.getByName(IP_BROAD);
                System.out.println(red);
                socket.joinGroup(red);
                socket2.joinGroup(red);
                
            }

            public void run() {
                    
                    try {
                       if(!socket.isClosed()){
                           ip = InetAddress.getLocalHost().getHostAddress();
                           
                            System.out.println("Me doy la bienvenida. Soy "+ip+". Estoy listo para rulear!");
                            imprimirConsola("Me doy la bienvenida. Soy "+ip+". Estoy listo para rulear!");
                            String sale = "Me doy la bienvenida. "+new Date().toString();
                            vista.btnConectar.setEnabled(false);
                            vista.btnDesconectar.setEnabled(true);
                            
                            
                            
                            Paquete saludo = new Paquete(0,ip);
                            enviarPaquete(saludo);
                            estoyVivo();
  
    
                       }
                       else System.out.println("Mierda, puerto cerrado...");
                       
                        
                    } catch (Throwable t) {
                        //t.printStackTrace();;
                    }
                
            }
        }

        conectar c = new conectar();
        c.start();
    }
    
    public void escucharBeta() throws Throwable{
        class escucharBeta extends Thread{
            public escucharBeta(){
                super();
            }
            
                    byte[] buf = new byte[TAMANO_BUFER];
                    DatagramPacket rec = new DatagramPacket(buf,buf.length);
            
            public void run(){
                if(!socket.isClosed()){
                    
                    ArrayList<DatagramPacket> r = new ArrayList<DatagramPacket>();
                    while(!socket.isClosed()){
                        try {
                            escuchando();
                        } catch (IOException ex) {
                            Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (ClassNotFoundException ex) {
                            Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                }
            }
        }
            
        public synchronized void escuchando () throws IOException, ClassNotFoundException{
           

                            socket2.receive(rec);
                            
                            //System.out.println("SOCKET SIZE " +rec.getLength());
                            if(rec.getData()!=null){
                                
                                Paquete recibido = (Paquete) bytesAObjeto(rec.getData());
                                String data = new String(recibido.data); //Data del archivo recibido
                                
                                String imprimir=""; 
                                    if(recibido.inst == 0){ imprimir+="Recibido: Hola mundo, de "; imprimir+=data;}
                                    if(recibido.inst == 4) imprimir+="PEDIDO "; 
                                    if(recibido.inst == 2 || recibido.inst==4 && recibido.ipDest.equals(ip)){ 
                                        imprimir+=" Paquete, de " + rec.getAddress().getHostAddress();
                                        imprimir+=". Nombre: "+recibido.nombreAr+" parte: "+recibido.parte;
                                        if(recibido.inst==4) imprimir+=" pedazo pedido.";
                                        if(debugger || recibido.inst==4)System.out.println(imprimir+" .Size: "+rec.getData().length+" Para: "+recibido.ipDest);
                                    }

                                    
                                    if(!data.equals(ip) && recibido.inst==4) imprimirConsola(imprimir);
                                    
                                    if(recibido.inst==4 && recibido.ipDest.equals(ip)){
                                    synchronized(partesArchivo){
                                        if(!partesArchivo.contains(recibido)){
                                            recibido.ipDest = rec.getAddress().getHostAddress();
                                            partesArchivo.add(recibido);
                                            contRecibidos++;
                                        }
                                    }
                                    }
                            }
        }
        public Object bytesAObjeto(byte[] bytes) throws IOException, ClassNotFoundException{
        ByteArrayInputStream bs= new ByteArrayInputStream(bytes); // bytes es el byte[]
        ObjectInputStream is = new ObjectInputStream(bs);
        Object o = (Object)is.readObject();
        is.close();
        return o;
    }
        }
        
        
        escucharBeta e = new escucharBeta();
        e.start();
    }
                                
                                
    
    
    public void escuchar() throws Throwable{
        class escuchar extends Thread{
            public escuchar(){
                super();
            }
            
                    byte[] buf = new byte[TAMANO_BUFER];
                    DatagramPacket rec = new DatagramPacket(buf,buf.length);
            
            public void run(){
                if(!socket.isClosed()){
                    
                    ArrayList<DatagramPacket> r = new ArrayList<DatagramPacket>();
                    while(!socket.isClosed()){
                        escuchando();
                }
            }
        }
            
            public Object bytesAObjeto(byte[] bytes) throws IOException, ClassNotFoundException{
                ByteArrayInputStream bs= new ByteArrayInputStream(bytes); // bytes es el byte[]
                ObjectInputStream is = new ObjectInputStream(bs);
                Object o = (Object)is.readObject();
                is.close();
                return o;
            }
            
        public synchronized void escuchando (){
            try {

                            socket.receive(rec);
                            
                            //System.out.println("SOCKET SIZE " +rec.getLength());
                            if(rec.getData()!=null){
                                
                                Paquete recibido = (Paquete) bytesAObjeto(rec.getData());
                                String data = new String(recibido.data); //Data del archivo recibido
                                
                            
                                //-- Imprimir para consola y GUI 
                                if(!rec.getAddress().getHostAddress().equals(ip) || recibido.inst==1){
                                    String imprimir=""; 
                                    if(recibido.inst == 0){ imprimir+="Recibido: Hola mundo, de "; imprimir+=data;}
                                    if(recibido.inst == 4 && recibido.ipDest.equals(ip)) imprimir+="PEDIDO "; 
                                    if(recibido.inst == 2 || recibido.inst==4 && recibido.ipDest.equals(ip)){ 
                                        imprimir+=" Paquete, de " + rec.getAddress().getHostAddress();
                                        imprimir+=". Nombre: "+recibido.nombreAr+" parte: "+recibido.parte;
                                        if(recibido.inst==4) imprimir+=" pedazo pedido.";
                                        if(debugger || recibido.inst==4)System.out.println(imprimir+" .Size: "+rec.getData().length+" Para: "+recibido.ipDest);
                                    }

                                    
                                    if(!data.equals(ip) && recibido.inst==4) imprimirConsola(imprimir);
                                
                                
                                //-- Imprimir fin --


                                // Aquí se da la bienvenida a otra maquina diferente a esta
                                // y se agrega a vecinos (instrucción recibida : 0)
                                if(recibido.inst==0 && !data.equals(ip)){
                                    Paquete resp = new Paquete();
                                    resp.inst = 1 ;
                                    resp.data = ip.getBytes();
                                    resp.ipDest = data;
                                    if(!vecinos.contains(data)) vecinos.add(data);
                                    String res = "Saludando y agregando a "+data;
                                    imprimirConsola(res);
                                    enviarPaquete(resp);
                                }
                                

                                //Aquí se agrega a vecinos que me dan la bienvenida :)
                                else if(recibido.inst==1 && recibido.ipDest.equals(ip)){
                                    String vecino = data.substring(data.indexOf("|")+1,data.length());
                                    if(!vecinos.contains(vecino)){
                                        String res = "Agregando vecino que me saludó "+vecino;
                                        vecinos.add(vecino);
                                        imprimirConsola(res);
                                    }
                                    else System.out.println("Vecino me saluda de nuevo :S");
                                }
                                
                                
                                //Aquí se recibe el paquete enviado de otro lado y se agrega a rotando
                                else if(recibido.inst==2 && recibido.ipDest.equals(ip) && !recibido.nombreAr.equals(archivoBorrar)){
                                    synchronized(rotando){
                                       if(!rotando.contains(recibido))
                                        rotando.add(recibido);
                                       temporal.add(recibido);
                                    }
                                       
                                }
                                
                                
                                //Aquí se envian pedazos de archivo que alguien está solicitando...
                                else if(recibido.inst==3 && !data.equals(ip)){
                                    imprimirConsola("Me estan pidiendo partes del archivo "+recibido.nombreAr);
                                    
                                    synchronized(rotando){
                                        System.out.println("-*-*- Rotando tamano "+temporal.size());
                                        contEnviados = 0;
                                        ArrayList<Paquete> paquetes = new ArrayList<Paquete>();
                                        for(Paquete p:rotando){
                                        if(p.nombreAr.equals(recibido.nombreAr)){
                                            contEnviados++;
                                            Paquete e = new Paquete();
                                            e.data = p.data;
                                            e.ipDest = data;
                                            e.inst = 4;
                                            e.parte = p.parte;
                                            e.nombreAr = p.nombreAr;
                                            paquetes.add(e);
                                            System.out.println("Enviando paquete pedido de archivo "+recibido.nombreAr);
                                            imprimirConsola("Enviando paquete pedido de archivo "+recibido.nombreAr);
                                        }
                                    }
                                        imprimirConsola("Envie "+contEnviados+" pedazos...");
                                        enviarPaquetes(paquetes);
                                    }
                                    
                                   
                                    
                                }
                                                                 
                                //Aquí me preparo para no recibir más paquetes de un archivo a borrar..
                                else if(recibido.inst==5){
                                     recibido.inst=0;
                                     imprimirConsola("Me estan pidiendo borrar "+recibido.nombreAr);
                                     archivoBorrar = recibido.nombreAr;
                                     cicloBorrado = 0;
                                    Archivo remover = null;
                                    for(Archivo a: archivos){ if(a.nombre.equals(archivoBorrar)) remover = a;}
                                    if(remover != null)archivos.remove(remover);
                                 }
                                 
                                 //Aquí recibo estado de vida de alguien..
                                else if(recibido.inst==6 && !data.equals(ip)){
                                     if(debugger) System.out.println("Estado vida de "+data);
                                     boolean existente = false;
                                     for(String v: vecinosVivos) if(v.equals(data)) existente = true;
                                     if(!existente){
                                         //System.out.println("Agregando vecino "+data);
                                         vecinosVivos.add(data);
                                     }
                                     if(!vecinos.contains(data)) vecinos.add(data);
                                 }
                                }
                                 
                                 
                                 //Aquí recibo solicitud de archivo nuevo.
                                 
                            }
                        } catch (Exception ex) {
                            Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
        }    
            
        escuchar e = new escuchar();
        e.start();
    }
    
    
    public void enviarPaquete(final Paquete pa) throws IOException, InterruptedException{
        Thread t = new Thread(new Runnable() {
             
            public void run(){
                if(!socket2.isClosed()){
                    try {
                        byte[] buf = new byte[TAMANO_BUFER];
                        buf = objetoABytes(pa);
                        //System.out.print("Voy a enviar... ");
                        InetAddress i;
                        if(vecinos.contains(pa.ipDest) && pa.inst!=2 && pa.inst!=1)  i = InetAddress.getByName(pa.ipDest);
                        else i = red;
                        int port = PUERTO;
                        if(pa.inst==4) port++;
                        DatagramPacket enviar = new DatagramPacket(buf, buf.length,i,port);
                        if(pa.inst!=4)socket.send(enviar);
                        else socket2.send(enviar);
                        
                    } catch (Exception ex) {
                        Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else System.out.println("Socket Cerrado!");
            }
        
            
        public byte[] objetoABytes(Object o) throws IOException{
            ByteArrayOutputStream bs= new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream (bs);
            os.writeObject(o);  // this es de tipo DatoUdp
            os.close();
            return  bs.toByteArray(); // devuelve byte[]    
        }
        
        
    });
        t.start();
  }
    
    
    public void enviarPaquetes(final ArrayList<Paquete> pa) throws IOException, InterruptedException{
        Thread t = new Thread(new Runnable() {
             
            public void run(){
                if(!socket2.isClosed()){
                    try {
                        byte[] buf = new byte[TAMANO_BUFER];
                        for(Paquete p: pa){
                            if(!p.nombreAr.equals(archivoBorrar)){
                                Thread.sleep(20L);
                                buf = objetoABytes(p);
                                //System.out.print("Voy a enviar... ");
                                InetAddress i;
                                if(vecinos.contains(p.ipDest) && p.inst!=2 && p.inst!=1)  i = InetAddress.getByName(p.ipDest);
                                else i = red;
                                int port = PUERTO;
                                if(p.inst==4) port++;
                                DatagramPacket enviar = new DatagramPacket(buf, buf.length,i,port);
                                if(p.inst!=4)socket.send(enviar);
                                else socket2.send(enviar);
                            }

                        }
          
                    } catch (Exception ex) {
                        Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else System.out.println("Socket Cerrado!");
            }
        
            
        public byte[] objetoABytes(Object o) throws IOException{
            ByteArrayOutputStream bs= new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream (bs);
            os.writeObject(o);  // this es de tipo DatoUdp
            os.close();
            return  bs.toByteArray(); // devuelve byte[]    
        }
        
        
    });
        t.start();
  }
    
    
    
    public void desconectar(){
        
        socket.close();
        socket.disconnect();
        vivo.stop();
    }
    
    
    

    public void listarArchivos() throws Throwable {
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    System.out.println("listar arcivos");
                    try {
                        this.wait(1000);
                    } catch (Throwable t) {
                        //t.printStackTrace();;
                    }
                }
            }
        });
        t.start();
    }
    
    
    public void rotar() throws Throwable {
        if(vecinos.isEmpty()) imprimirConsola("Estoy listo para rotar pero no ha vecinos...");
        else imprimirConsola("Listo para rotar....");
        rotar = new Thread(new Runnable() {

            @Override
            public void run() {
                while(true){
                    if (!socket.isClosed() && !vecinos.isEmpty()) {
                        try{
                            
                           
                        
                        temporal.clear();
                        
                        vista.paquetes.setText(rotando.size()+"");
                        int cont=0;
                        synchronized(rotando){
                            
                           
                            if(debugger && rotando.isEmpty()) System.out.println("NO HAY PAQUETES");
                            ArrayList<Paquete> pa = new ArrayList<Paquete>();
                            if(!archivoBorrar.equals("") && !rotando.isEmpty()){
                                    for(Paquete p: rotando)  if(p.nombreAr.equals(archivoBorrar)) rotando.remove(p);
                            }
                            while(!rotando.isEmpty()){
                                
                                if(debugger)System.out.print(rotando.size()+" ");
                                cont++;
                            
                                Paquete enviar = rotando.get(0);

                                boolean existente = false;
                                for(Archivo a: archivos){
                                    if(a.nombre.equals(enviar.nombreAr) && a.partes == enviar.partes) existente = true;
                                }

                                if(!existente && !enviar.nombreAr.equals(archivoBorrar)){
                                    String con = ("No conocía el archivo "+enviar.nombreAr+" con partes: "+enviar.partes+". Agregándolo a lista.");
                                     System.out.println(con); imprimirConsola(con);
                                     archivos.add(new Archivo(enviar.nombreAr,enviar.partes));
                                }
                                enviar.inst = 2;
                                int vecinoId = (int)(Math.random()+0.4)*(vecinos.size()-1);
                                if(vecinoId>vecinos.size()-1) imprimirConsola("ERROOOOOOOOOOORRR");
                                //System.out.println(vecinoId+"  "+vecinos.size());
                                enviar.ipDest = vecinos.get(vecinoId);
                                if(!enviar.nombreAr.equals(archivoBorrar))  pa.add(enviar);
                                String con = ("Enviando paquete y removiendo "+enviar.nombreAr+" parte "+enviar.parte+" a: "+enviar.ipDest);
                                if(debugger)System.out.println(con); //imprimirConsola(con);
                                  
                                rotando.remove(0);
                            }
                            enviarPaquetes(pa);
                            if(debugger) System.out.println("Fin envio");
                        }
                        
                        
                        String msg = vecinos.size()+". ";
                        for(String v: vecinos) msg+=v.substring(v.length()-4, v.length()) + " ";
                        vista.vecinos.setText(msg);
                        
                        
                         if(cicloBorrado!=-1){
                                cicloBorrado++;
                                if(debugger) System.out.println("Ciclo borrado "+cicloBorrado);
                                if(cicloBorrado==3){ 
                                    cicloBorrado=-1;
                                    Archivo remover = null;
                                    for(Archivo a: archivos){ if(a.nombre.equals(archivoBorrar)) remover = a;}
                                    if(remover != null)archivos.remove(remover);
                                    archivoBorrar = ""; 
                                }
                            } 
                        Thread.sleep(DELAY);
                    } catch (Throwable t) {
                        //t.printStackTrace();;
                    }
                    
                }
                }
                
            }
            
            public synchronized void rotando(){
                
            }
            
        });
        rotar.start();
    }
    
    
    public String traerArchivo(final String nombre, final int ope){
        System.out.println("Voy a traer e imprimir el archivo "+nombre);
        partesArchivo = new ArrayList<Paquete>();
        vecinosPartes = new ArrayList<Paquete>();
        contenidoArchivo = "";
        contRecibidos = 0;
        contEnviados = 0;
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                int cant = -1;
                for(Archivo a: archivos) if(a.nombre.equals(nombre)) cant = a.partes;

                
                if(cant!=-1 && !socket.isClosed()){  
                    try {
                        //Vamos a pedir a todos que nos envien el archivo....
                        System.out.println("Pidiendo que me envien el archivo con "+cant+" partes.");
                        Paquete pedir = new Paquete();
                        pedir.inst = 3;
                        pedir.data = ip.getBytes();
                        pedir.nombreAr = nombre;
                        
                        
                                                
                        
                        enviarPaquete(pedir);
                        //Se espera 3 veces el tiempo DELAY para que lleguen todos los pedazos...
                        for(int i=0; i<50; i++){
                            if(i==2 || i==15 || i==20 || i==8 || i==5 || i==25 || i==35 || i==40 || i==45 || i==49) enviarPaquete(pedir);
                            if(partesArchivo.size()>=cant){ i = 120; break;}
                            System.out.println("Partes "+partesArchivo.size());
                            synchronized(rotando){
                            for(Paquete p: rotando) if(p.nombreAr.equals(nombre) &&
                                !partesArchivo.contains(p)){ p.ipDest=ip; partesArchivo.add(p); contEnviados++;}
                            }
                            Thread.sleep(DELAY/5);
                        }
                        
                        
                        imprimirConsola("Yo tenía "+contEnviados+" partes. Me enviaron "+contRecibidos);
                        System.out.println("Yo tenía "+contEnviados+" partes. Me enviaron "+contRecibidos);
                        
                        System.out.println("Se trajeron "+partesArchivo.size()+" de "+cant+" totales. Listo para armar....");
                        for(Paquete p: partesArchivo) System.out.println("Me llego parte "+p.parte);
                        
                        //UNIR ACA UNIR PARTES ARCHIVO.
                        
                        String cont = "";
                        if(partesArchivo.size()==0)cont = "¡ERROR!. El archivo parece no estar rotando... 0 partes recibidas.";
                        else{
                            cont = "Se trajeron "+partesArchivo.size()+" de "+cant+" totales.";
                        }
                        
                        if(true){
                            if(ope==0){
                                try {
                                System.out.println("Voy a imprimir contenido archivo!");
                                cont = servicios.unirArchivo(partesArchivo);
                                contenidoArchivo += (cont+"\n -- FIN DE IMPRESIÓN --");
                                } catch (Exception ex) {
                                    Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            }
                            else{
                                Comparator<Paquete> c=new Comparator<Paquete>() {

                                    @Override
                                    public int compare(Paquete o1, Paquete o2) {
                                        return o1.parte-o2.parte;
                                    }
                                };
                                //probando comit
                                Collections.sort(partesArchivo,c);
                                
                                for(Paquete p : partesArchivo){
                                    cont+="\nParte "+p.parte+" la tenía: "+p.ipDest;
                                }
                                contenidoArchivo += cont;
                            }
                            
                        }
                        
                        
                        imprimirConsola(cont);
                        
                    } catch (IOException ex) {
                        Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    
                    

                }

                else System.out.println("ERROR. No encuentro el archivo en mi lista.");
            }
        });
        t.start();
       
        return contenidoArchivo;
    }
    
    
    public void borrarArchivo(final String nombre){
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                        Paquete p = new Paquete();
                        p.inst = 5;
                        p.nombreAr = nombre;
                        try {
                            enviarPaquete(p);
                        } catch (Exception e) {
                            System.out.println(e);}
                        
                        archivoBorrar = nombre;
                        String pal = "Borrando archivo... "+nombre;
                        System.out.println(pal); 
                        imprimirConsola(pal);
                        Archivo remover = null;
                                    for(Archivo a: archivos) if(a.nombre.equals(archivoBorrar)) remover = a;
                                    if(remover != null)archivos.remove(remover);
                        
                        cicloBorrado = 0;
                        
                }
         });
        t.start();
    }
    
    
    public void estoyVivo(){
        vivo = new Thread(new Runnable() {

            @Override
            public void run() {
                while(true){
                    vecinosVivos.clear();
                    Paquete p = new Paquete();
                        p.inst = 6;
                        p.data = ip.getBytes();
                        
                        try {
                            enviarPaquete(p);
                        } catch (IOException ex) {
                            Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                            
                        
                        try {
                            Thread.sleep(DELAY);
                            enviarPaquete(p);
                        } catch (Exception ex) {
                            Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        
                        if(vecinosVivos.size()!=vecinos.size()){
                            ArrayList<String> vecinosBorrar = new ArrayList<String>();
                            for(String ve : vecinos){
                                if(!vecinosVivos.contains(ve)) vecinosBorrar.add(ve);
                            }
                            for(String ve: vecinosBorrar){
                                String mensaje = "Se murió el vecino "+ve+". Borrándolo de mi lista...";
                                System.out.println(mensaje); imprimirConsola(mensaje);
                                vecinos.remove(ve);
                            }
                        }
                }
              }
         });
        vivo.start();
    }
    
    //Archivo nuevo creado por nosotros
    public void recibirArchivo(final List<Paquete> recibido) {
        archivos.add(new Archivo(recibido.get(0).nombreAr,recibido.get(0).partes));
         Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                
                     rotando.addAll(recibido);
                        
                
                String res = "Agregado y listo para rotar el archivo "+recibido.get(0).nombreAr+" de "+recibido.size()+" paquetes.";
                System.out.println(res); imprimirConsola(res);
            
        
         }
    });
         t.start();
    }
    
    
    
    
    
    
    public void imprimirConsola(String mensaje){
        if(vista.consola.getLineCount()!=13){
            vista.consola.setText(vista.consola.getText()+"\n"+mensaje);
        }
        else vista.consola.setText(mensaje+"\n");
    }
}
